/*
1.路径解析：::
2.方法调用和字段访问：., .(), []
3.函数调用和构造器：(), {}
4.一元运算符：
? (错误传播)
! (宏调用)
- (负号)
* (解引用)
& 和 &mut (引用)
! (逻辑非)
5.类型转换：as
6.乘除取模：*, /, %
7.加减：+, -
8.位移：<<, >>
9.按位与：&
10.按位异或：^
11.按位或：|
12.比较：
==, !=
<, >, <=, >=
13.逻辑与：&&
14.逻辑或：||
15.范围：.., ..=
16.赋值和复合赋值：
=
+=, -=, *=, /=, %=
&=, |=, ^=, <<=, >>=
17.闭包：|...| ...
*/

// Option 是 Rust 中处理可能存在或不存在的值的核心枚举类型，而 Some 是 Option 的一个变体。
/*
pub enum Option<T> {
    None,    // 表示无值
    Some(T), // 表示有值，值为T类型
}
*/

fn my_chk_fun(ival : String) {
    println!("[{},{}]v={:p},{}", file!(), line!(), ival.as_ptr(), ival);
}

fn main() {
    {
        let a = 5;
        let b = a;
        println!("[{},{}],a={:p},{};b={:p},{}", file!(), line!(), &a, a, &b, b);
    }
    {
        let a = String::from("mystr");
        println!("[{},{}]a={:p},{}", file!(), line!(), a.as_ptr(), a);// 
        let b = a;// a丧失所有权， b获得所有权？
        println!("[{},{}]b={:p},{}", file!(), line!(), b.as_ptr(), b);// a空间移动到了b，
        // println!("[{},{}],a={},{};b={},{}", file!(), line!(), a.as_ptr(), a, b.as_ptr(), b);String赋值语句，是移动赋值，此时a无效了。编译时就报错了。
    }
    {
        let a = String::from("mystr");
        let b = a.clone();
        println!("[{},{}],a={:p},{};b={:p},{}", file!(), line!(), a.as_ptr(), a, b.as_ptr(), b);
        // 备注：c语言赋值是浅拷贝，c++的string赋值是深拷贝。内容移动是高效的。
    }
    {
        let a = String::from("mystr");
        println!("[{},{}]a={:p},{}", file!(), line!(), a.as_ptr(), a);// 
        my_chk_fun(a);
        // println!("[{},{}]a={:p},{}", file!(), line!(), a.as_ptr(), a);// 报错，a被移动到函数的参数了。
    }
}

